package com.lx.base.util;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.*;

public class ReflectUtil {
    /**
     * 获取类的所有属性包括父级
     * @param type
     * @return
     */
    public static List<Field> getField(Class<?> type){
        List<Field> result=new ArrayList<>();
        for(Class<?> c=type;c!=null;c=c.getSuperclass()){
            result.addAll(Arrays.asList(c.getDeclaredFields()));
        }
             return    result;
    }
    /**
     * 获取类的所有属性包括父级
     * @param type
     * @return
     */
    public static List<Method> getMethod(Class<?> type){
        List<Method> result=new ArrayList<>();
        for(Class<?> c=type;c!=null;c=c.getSuperclass()){
            result.addAll(Arrays.asList(c.getDeclaredMethods()));
        }
        return    result;
    }

    /**
     * 获取属性类型
     * @param type
     * @return
     */
    public static JSONObject getFieldAnno(Class type, Class<? extends Annotation> annoType){
        JSONObject result=new JSONObject();
        for(Class<?> c=type;c!=null;c=c.getSuperclass()){
            for(Field field:c.getDeclaredFields()){
                if(field.isAnnotationPresent(annoType)){
                result.put(field.getName(), field.getDeclaredAnnotation(annoType));
            }
        }
        }
        return    result;
    }


    /**
     * 获取属性类型
     * @param type
     * @return
     */
    public static Map<String,Class<?>> getFieldType(Class<?> type){
        Map<String,Class<?>> result=new HashMap<>();
        for(Class<?> c=type;c!=null;c=c.getSuperclass()){
            for(Field field:c.getDeclaredFields()){
                result.put(field.getName(),field.getType());
            }
        }
        return    result;
    }
}
